DB相關的處理會用到gorm
直接來裝最新版
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
gorm本身預設就會用到Connection Pool
所以要設最大最小的DB連線數
如果是單台server直接設到你DB的最大上限即可
model/init.go
// DBConn DBConn
var DBConn *gorm.DB
// Init Init
func Init() {
DBConn = connDB(
config.Val.DBUser,
config.Val.DBPass,
config.Val.DBHost,
config.Val.DBPort,
config.Val.DBDatabase,
config.Val.DBMaxLifeTime,
config.Val.DBMaxConn,
config.Val.DBIdleConn)
}
func connDB(user, pass, host, port, database string, lifeTime, maxCon, idle int) *gorm.DB {
addr := fmt.Sprintf(
"%v:%v@tcp(%v:%v)/%v?charset=utf8&parseTime=true",
user,
pass,
host,
port,
database,
)
db, err := gorm.Open(mysql.Open(addr), &gorm.Config{})
if err != nil {
panic(err) // 連不到就直接panic裡服務重起再連
}
sqlDB, err := db.DB()
if err != nil {
panic(err)
}
sqlDB.SetConnMaxLifetime(time.Duration(lifeTime) * time.Second) // 每條連線的存活時間
sqlDB.SetMaxOpenConns(maxCon) // 最大連線數
sqlDB.SetMaxIdleConns(idle)// 最大閒置連線數
return db
}
[POST] /api/task
參數:
parent_id int
name string
上一篇已經有了table
這邊會根據它的資料型態來建一個struct來存取資料
model/task.go
const (
// TaskDisable TaskDisable
TaskDisable = 0
// TaskAble TaskAble
TaskAble = 1
// TaskDone TaskDone
TaskDone = 2
)
// Task Task
type Task struct {
ID int `json:"id,omitempty"`
ParentID int `json:"parent_id,omitempty"`
UserID string `json:"user_id,omitempty"`
Name string `json:"name,omitempty"`
Status int `json:"status,omitempty"`
CreatedTimestamp int64 `json:"created_timestamp"`
}
// TasksTable TasksTable
const TasksTable = "tasks"
// TaskModel TaskModel
var TaskModel = TasksModelObj{
Table: TasksTable,
}
// TasksModelObj TasksModelObj
type TasksModelObj struct {
Table string
}
// Create Create
func (m TasksModelObj) Create(task Task) error {
return DBConn.Table(m.Table).Create(&task).Error
}
main.go
api.POST("/task", middleware.Auth(), handler.CreateTask)
handler/api.go
// CreateTask CreateTask
func CreateTask(c *gin.Context) {
var taskData model.Task
c.BindJSON(&taskData)
taskData.UserID = c.GetString("user_id")
taskData.Status = model.TaskAble
taskData.CreatedTimestamp = time.Now().UTC().Unix()
if err := model.TaskModel.Create(taskData); err != nil {
log.WithFields(log.Fields{
"task_data": taskData,
"origin_err": err.Error(),
}).Error("db error")
res.SystemError(c, res.ErrSystemCode, gin.H{})
return
}
res.Success(c, gin.H{})
}
試打一下
今天的commit
謝謝大家~